<?php

/**
 * \file
 * Démonstration de l'utilisation des références à travers les
 * collections d'objets.
 *
 * Pour des raisons de concision on se base sur une relation entre
 * objets ne faisant intervenir d'une seule entité. Ici on
 * traite de la relation qui lie une personne à ses deux parents.
 * Cela permet d'une part d'aborder le problème des références
 * récursives, et d'autre part de mettre en oeuvre des références
 * sur plusieurs niveaux.
 *
 * \todo Rendre indépendant de Toguna.
 *
 * \since 08/03/2009
 * \author Matthieu OVIEDO <matthieu.oviedo@gmail.com> 
 */

// Inclusion du noyau de pilar et connection à une base de données :
 include('../../../toguna.config.php');
 include(DOCUMENT_ROOT.'/inc/hInit.inc.php');

use \pilar\Entities as Ents;
use \pilar\Objects as Objs;

// Dans notre exemple on a besoin d'une entité Personne :
 $Person = new Ents\Entity(array(
  'prefix' => 'test', // Il s'agit d'une entité de test donc autant ne
                      // pas conchier les entités existantes en base
                      // de données.
  'name' => 'person',
  'objectClass' => '\PersonObject', // Voir plus bas.
  'members' => array(
   new Ents\String(array('name' => 'name'))
  )
 ));
 // Ajout des références récursives :
  $Person->addMembers(array(
   new Ents\Ref(array('name' => 'mother', 'entity' => $Person)),
   new Ents\Ref(array('name' => 'father', 'entity' => $Person)),
  ));
 // Création de la table associée à l'entité Personne :
  $Person->dropTable()->createTable();

// Classe associée aux objets issus de l'entité Personne :
 class PersonObject extends Objs\Object {
  private function sayHello() {
   echo 'Salut!'.
        ' Je suis <strong>'.$this->name->get().'</strong> !<br />';
  }

  private function tellAboutYourParents() {
   if ($this->mother instanceof Objs\Object) {
    echo 'Ma maman dit :<br />';
    echo '<ul>'; $this->mother->tellAboutYou(); echo '</ul>';
   }
   if ($this->father instanceof Objs\Object) {
    echo 'Mon papa dit :<br />';
    echo '<ul>'; $this->father->tellAboutYou(); echo '</ul>';
   }
  }

  public function shortDescription() {
   return $this->name->get();
  }

  public function tellAboutYou() {
   $this->sayHello();
   $this->tellAboutYourParents();
  }
 }

// Création de notre petite famille :
 // Les grands parents du côté paternel :
  $jules = $Person->newObject()->name->set('Jules')->save();
  $blanche = $Person->newObject()->name->set('Blanche')->save();
 // Les parents :
  $paul = $Person->newObject()->set(array(
   'name' => 'Paul',
   'mother' => $blanche->id(), 'father' => $jules->id()
  ))->save();
  $valerie = $Person->newObject()->name->set('Valerie')->save();
 // La fille :
  $julie = $Person->newObject()->set(array(
   'name' => 'Julie',
   'mother' => $valerie->id(), 'father' => $paul->id()
  ))->save();

// Recherche des personnes en exportant les références sur 2 niveaux :
 echo '<h2>Liste des personnes :</h2><br />';
 $people = $Person->newCollection()->export(array(
  'father' => array('father', 'mother'),
  'mother' => array('father', 'mother')
 ));
 foreach ($people as $person) {
  $person->tellAboutYou();
  echo '<hr />';
 }

// Affichage de la trace :
 $TRACE->display();

?>
